
$.extend({
    validator:{
        is_empty:function(val){
            return !val || /^\s*$/.test(val);
        },
        is_mob:function(val){
            return /^1[345678]\d{9}$/.test(val);
        },
        len:function(val,min,max){
            val=val || "";
            max=max || min;
            return val.length>=min && val.length<=max;
        },
        match:function(val,reg){
            //正则匹配
            var r=new RegExp(reg);
            return r.test(val);
        },
        is_ident:function(val){
            //是否身份证
            return $.validator.match(val,"^((\\d{14})|(\\d{17}))[0-9xX]$");
        }

    }
});
$.fn.extend({
    validator:function(opts){
        opts= $.extend({
            model:0,//验证模式：1全部验证，0遇到未通过验证，则立即退出验证
            blurValidate:true,//是否失去焦点后，立即验证
            ajax:false,//是否启用ajax自动提交
            fail:function(items){
                //items表示验证失败的控件，及相应的错误消息
                //验证失败，则调用该函数
            },
            itemFail:function(){
                //单个表单项验证失败
                //this对象表示当前验证失败的控件
            },
            itemSuccess:function(){
                //表单项通过验证
            },
            submitBefore:function(){
                //验证通过之后，提交之前的回调函数
                //    如果要取消默认的处理，则返回false
            },
            submitSuccess:function(res){
                //ajax自动提交后回调函数
            }
        },opts);
        var $this=this;
        function valid(obj){
            var $obj=$(obj);
            var val=$obj.val() || "";
            var items=$obj.attr("validate") || "required";
            items=items.split(",");
            var errors=$obj.attr("error") || "";
            errors=errors.split(",");
            var item;
            var pass=true;
            var error_msg=false;
            $.each(items,function(i){
                item=items[i];
                switch (item) {
                        case "required":
                            var p="^"+($obj.attr("data-null") || "\\s*")+"$";
                            //必需输入项
                            if ($.validator.match(val,p)) {
                                pass=false;
                                error_msg=errors[i]||errors[0];
                                return false;
                            }
                            break;
                        case "number":
                            //验证是否数字
                            if(!(/^(-?\d+(\.\d+)?)$/.test(val))){
                                pass=false;
                                error_msg=errors[i]||errors[0];
                                return false;
                            }
                            break;
                        case "email":
                            //验证电邮地址

                            break;
                        case "ident":
                            //验证身份证
                            if(!(/^((\d{14})|(\d{17}))[0-9xX]$/.test(val))){
                                pass=false;
                                error_msg=errors[i]||errors[0];
                                return false;
                            }
                            break;
                            break;
                        case "mob":
                            //验证手机
                            if(!(/^1[34578]\d{9}$/.test(val))){
                                pass=false;
                                error_msg=errors[i]||errors[0];
                                return false;
                            }
                            break;
                        case "len":
                            //验证长度
                            var minmax=$obj.attr("data-len") ;
                            if(minmax && !/^\s*$/.test(minmax) && /^\d+(,\d+)?$/){
                                minmax=minmax.split(",");
                                var min=minmax[0];
                                var max=min;
                                if(minmax.length==2)
                                    max=minmax[1];
                                if(val.length<min || (val.length>max  && max!="" && minmax.length==2) || (val.length>max && minmax.length==1)  ){
                                    pass=false;
                                    error_msg=errors[i]?errors[i]:errors[0];
                                    return false;
                                }
                            }else{
                                layer.alert("请提供验证长度的特性值：data-len");
                                return false;
                            }
                            break;
                        case "contact":
                            var target=$($obj.attr("data-contact")).val();
                            if(target!=val){
                                pass=false;
                                error_msg=errors[i]?errors[i]:errors[0];
                                return false;
                            }
                            break;
                        default :
                            var r="^(!?)/(.+)/$";
                            if($.validator.match(item,r)){
                                //正则验证
                                var reg=new RegExp(r);
                                var res=reg.exec(item);
                                var not=(res[1]=="!");
                                if(!(not^$.validator.match(val,res[2]))){
                                    pass=false;
                                    error_msg=errors[i]?errors[i]:errors[0];
                                    return false;
                                }
                            }
                            break;
                    }
            });
            //if(pass){
            //    $obj.removeClass("Validform_error").closest("div.row").find("div.col-4").html("");
            //}
            //else
            //    $obj.addClass("Validform_error").closest("div.row").find("div.col-4").html('<span class="Validform_checktip Validform_wrong">'+error_msg+'</span>');
            return error_msg;
        }
        $(function(){
            $($this).each(function(){
                var $body=$(this);
                var msg={content:""};
                if(opts.blurValidate){
                    $("[validate]",$body).each(function(){
                        $(this).on("blur",function(){
                            var error='';
                            if(error=valid(this)){
                                opts.itemFail.call(this,error);
                            }else{
                                opts.itemSuccess.call(this);
                            };
                        });
                    });
                }
                var $form=$body;
                if(this.tagName!="FORM"){
                    $form=$body.find("form");
                }
                window.submitting=false;//正在提交表单
                $form.on("submit",function(){
                    var targets=$("[validate]",$body);
                    var i=targets.size();
                    var j=i;
                    var error_items=[];
                    var flag=true;//指示是否应该要完成全部的验证
                    targets.each(function(){
                        //var error=false;
                        if(error=valid(this)){
                            i--;
                            opts.itemFail.call(this,error);
                            error_items.push({item:this,error:error});
                            if(opts.model==0){
                                flag=false;
                                return false;
                            }
                        }else{
                            opts.itemSuccess.call(this);
                        }
                    });
                    var pass=(i==j);
                    if(!flag && !pass){
                        //遇到验证失败，则直接退出
                        opts.fail(error_items);
                        return false;
                    }

                    if(pass){
                        if(opts.submitBefore.call(this)===false){
                            return false;
                        }
                    }else{
                        opts.fail(error_items);
                    }
                    if(opts.ajax){
                        //启用ajax自动提交
                        //submitting

                        var token=parseInt($("#token").val());
                        if(token==1 || window.submitting){
                            if(window.layer){
                                window.layer.alert("请勿反复提交表单");
                            }else{
                                alert("请勿反复提交表单!");
                            }
                            return false;
                        }
                        $.ajax({
                            url: $form.attr("action"),
                            type:$form.attr("method"),
                            dataType:"json",
                            data:$form.serialize(),
                            beforeSend:function(){
                                window.submitting=true;
                            },
                            success:function(res){
                                opts.submitSuccess(res);
                            },
                            error:function(){
                                alert("提交失败！");
                            },
                            complete:function(){
                                window.submitting=false;
                            }
                        });
                        //取消默认的表单提交方式
                        return false;
                    }else{
                        return pass;
                    }

                });
            });
        })
        return $($this);
    }
})